const 温度转换 = `# 温度转换
温度 = '37C' # 格式为 摄氏度：37C 或者 华氏度：98.60F
如果 温度[-1] 在 ['F','f']:
    摄氏度 = (评估(温度[0:-1]) - 32) / 1.8
    打印("转换后的温度是:{:.2f}C".格式化(摄氏度))
或如 温度[-1] 在 ['C','c']:
    华氏度 = 1.8 * 评估(温度[0:-1]) + 32
    打印("转换后的温度是:{:.2f}F".格式化(华氏度))
否则:
    打印("输出格式错误")
`;

const 数字形态转换 = `# 数字形态转换
阿拉伯数字 = '12'
汉字数字 = "零一二三四五六七八九"
对于 数字 在 阿拉伯数字:
    打印(汉字数字[评估(数字)], end="")
`;

const 凯撒密码 = `# 凯撒密码
待加密 = 'my dick is small'
对于 字 在 范围(长(待加密)):
    此字 = 符值(待加密[字])
    如果 (待加密[字] == 'w'):
        打印('z', end="")
    或如 (此字 >= 97 与 此字 <= 122):
        已加密 = 符((符值(待加密[字])-93) % 26+96)
        打印(已加密, end="")
    或如 (此字 >= 65 与 此字 <= 90):
        已加密 = 符((符值(待加密[字])-62) % 26+65)
        打印(已加密, end="")
    否则:
        打印(待加密[字], end="")
`;

const 星号三角形 = `# 星号三角形
星星数 = 12
如果 星星数 % 2 != 1:
    星星数 += 1
对于 层数 在 范围(舍入((星星数-1)/2)+1):
    星星 = '*'*(层数*2+1)
    打印(星星.center(星星数, " "))
`;

const 身体质量指数BMI = `# 身体质量指数BMI
身高 = 1.75 # 输入身高(米)
体重 = 65   # 输入体重(公斤)
bmi指数 = 体重 / 乘方(身高, 2)
打印("BMI 数值为：{:.2f}".格式化(bmi指数))
标准, 国标 = "", ""
如果 bmi指数 < 18.5:
    标准, 国标 = "偏瘦", "偏瘦"
或如 18.5 <= bmi指数 < 24:
    标准, 国标 = "正常", "正常"
或如 24 <= bmi指数 < 25:
    标准, 国标 = "正常", "偏胖"
或如 25 <= bmi指数 < 28:
    标准, 国标 = "偏胖", "偏胖"
或如 28 <= bmi指数 < 30:
    标准, 国标 = "偏胖", "肥胖"
否则:
    标准, 国标 = "肥胖", "肥胖"
打印("BMI 指标为:国际'{0}', 国内'{1}'".格式化(标准, 国标))
`;

const 圆周率蒙特卡洛方法 = `# 圆周率蒙特卡洛方法
从 随机 导入 随机
从 时间 导入 性能计数器
基准 = 1000*1000
击中 = 0.0
开始时间 = 性能计数器()
对于 i 在 范围(1, 基准+1):
    x, y = 随机(), 随机()
    计算值 = 乘方(x ** 2 + y ** 2, 0.5)
    如果 计算值 <= 1.0:
        击中 = 击中 + 1
圆周率 = 4 * (击中/基准)
打印("圆周率值是: {}".格式化(圆周率))
打印("运行时间是: {:.5f}s".格式化(性能计数器() - 开始时间))
`;

const 排序算法 = `# 排序算法
函数 冒泡排序(目标数组):
    对于 索引一 在 范围(长(目标数组), 0, -1):
        标记 = 错
        对于 索引二 在 范围(0, 索引一 - 1):
            如果 目标数组[索引二] > 目标数组[索引二+1]:
                目标数组[索引二], 目标数组[索引二+1] = 目标数组[索引二+1], 目标数组[索引二]
        如果 标记:
            终止
    返回 目标数组


函数 希尔排序(目标数组):
    步长 = 长(目标数组)
    当 步长 > 0:
        步长 //= 2
        对于 甲 在 范围(步长, 长(目标数组)):
            替换 = 目标数组[甲]
            乙 = 甲
            当 乙 >= 步长 与 替换 < 目标数组[乙-步长]:
                目标数组[乙] = 目标数组[乙-步长]
                乙 -= 步长
            目标数组[乙] = 替换
    返回 目标数组


函数 冒泡排序(目标数组):
    对于 甲 在 范围(长(目标数组), 0, -1):
        标记 = 错
        对于 乙 在 范围(0, 甲 - 1):
            如果 目标数组[乙] > 目标数组[乙+1]:
                目标数组[乙], 目标数组[乙+1] = 目标数组[乙+1], 目标数组[乙]
        如果 标记:
            终止
    返回 目标数组


函数 快速排序(目标数组):

    函数 _快速排序(目标数组, 左指针, 右指针):
        枢轴 = 目标数组[左指针]
        原左指针 = 左指针
        原右指针 = 右指针
        左指针空标记 = 0  # 左指针 po整数er null
        当 左指针 != 右指针:
            如果 左指针空标记:
                如果 (目标数组[左指针] >= 枢轴):
                    目标数组[右指针] = 目标数组[左指针]
                    左指针空标记 = 0
                否则:
                    左指针 += 1
            否则:
                如果 (目标数组[右指针] < 枢轴):
                    目标数组[左指针] = 目标数组[右指针]
                    左指针空标记 = 1
                否则:
                    右指针 -= 1
        中指针 = 左指针
        目标数组[中指针] = 枢轴
        如果 原左指针 < 中指针 - 1:
            _快速排序(目标数组, 原左指针, 中指针 - 1)
        如果 中指针+1 < 原右指针:
            _快速排序(目标数组, 中指针+1, 原右指针)

    左指针 = 0
    右指针 = 长(目标数组) - 1
    _快速排序(目标数组, 左指针, 右指针)
    返回 目标数组


函数 选择排序(目标数组):
    对于 甲 在 范围(长(目标数组)):
        最小数值 = 甲
        对于 乙 在 范围(甲, 长(目标数组)):
            如果 目标数组[乙] < 目标数组[最小数值]:
                最小数值 = 乙
        目标数组[甲], 目标数组[最小数值] = 目标数组[最小数值], 目标数组[甲]
    返回 目标数组


导入 随机
从 拷贝 导入 深拷贝
数据集 = [随机.随机数(0, 100) 对于 _ 在 范围(20)]
打印("     原数据:", 数据集)
打印("   希尔排序:", 希尔排序(深拷贝(数据集)))
打印("   冒泡排序:", 冒泡排序(深拷贝(数据集)))
打印("   快速排序:", 快速排序(深拷贝(数据集)))
打印("   选择排序:", 选择排序(深拷贝(数据集)))
`;

export const tutorials = [
  {
    description: '温度转换',
    source: 温度转换
  },
  {
    description: '数字形态转换',
    source: 数字形态转换
  },
  {
    description: '凯撒密码',
    source: 凯撒密码
  },
  {
    description: '星号三角形',
    source: 星号三角形
  },
  {
    description: '身体质量指数BMI',
    source: 身体质量指数BMI
  },
  {
    description: '圆周率蒙特卡洛方法',
    source: 圆周率蒙特卡洛方法
  },
  {
    description: '排序算法',
    source: 排序算法
  },
];
